import Vue from 'vue'
import VueRouter from 'vue-router'
// 引入路由
import routes from './routes'
import { getStorage } from '../utils/auth'

Vue.use(VueRouter)

// 解决多次点击同一路由跳转报错 NavigationDuplicated（重复导航到当前位置）
// 保存一份push方法
let originPush = VueRouter.prototype.push
/**
 * 重写push方法
 * @param {*} localtion 跳转的路由
 * @param {*} resolve 成功回调
 * @param {*} reject 失败回调
 * @returns
 */
VueRouter.prototype.push = function (localtion, resolve, reject) {
  // 如果传递了成功和失败的回调
  if (resolve && reject) {
    // 改变originPush方法的this指向，window->VueRouter实例
    return originPush.call(this, localtion, resolve, reject)
  }
  // 如果没有传递了成功和失败的回调，则手动传递
  originPush.call(
    this,
    localtion,
    () => {},
    () => {}
  )
}

// 保存一份replace方法
let originReplace = VueRouter.prototype.replace
/**
 * 重写replace方法
 * @param {*} localtion 跳转的路由
 * @param {*} resolve 成功回调
 * @param {*} reject 失败回调
 * @returns
 */
VueRouter.prototype.replace = function (localtion, resolve, reject) {
  // 如果传递了成功和失败的回调
  if (resolve && reject) {
    // 改变originPush方法的this指向，window->VueRouter实例
    return originReplace.call(this, localtion, resolve, reject)
  }
  // 如果没有传递了成功和失败的回调，则手动传递
  originReplace.call(
    this,
    localtion,
    () => {},
    () => {}
  )
}

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes,
})

// 路由拦截
router.beforeEach((to, form, next) => {
  const userInfo = getStorage('userInfo')
  // 已登录
  if (userInfo) {
    // 去登录页，直接返回
    if (to.path === '/login') {
      next('/home/visual')
    } else {
      next()
    }
  } else {
    // 未登录
    if (to.path === '/login') {
      next()
    } else {
      next('/login')
    }
  }
})

export default router
